#define _CRT_SECURE_NO_WARNINGS 1

#include<iostream>
#include<vector>
#include<cstring>
#include<algorithm>

using namespace std;

//const int N = 2010;
//
//int n, m;
//int f[N];

//int main()
//{
//    cin >> n >> m;
//    for (int i = 0; i < n; i++)
//    {
//        int v, w, s;
//        cin >> v >> w >> s;
//        for (int j = m; j >= 0; j--)
//            for (int k = 1; k <= s && k * v <= j; k++)
//                f[j] = max(f[j], f[j - k * v] + k * w);
//    }
//
//    cout << f[m] << endl;
//    return 0;
//}

//int main()
//{
//    cin >> n >> m;
//    vector<pair<int, int>> goods;
//    for (int i = 0; i < n; i++)
//    {
//        int v, w, s;
//        cin >> v >> w >> s;
//        for (int k = 1; k <= s; k *= 2)
//        {
//            s -= k;
//            goods.push_back(make_pair(v * k, w * k));
//        }
//        if (s > 0)   goods.push_back(make_pair(v * s, w * s));
//    }
//
//    for (auto good : goods)
//        for (int j = m; j >= good.first; j--)
//            f[j] = max(f[j], f[j - good.first] + good.second);
//
//    cout << f[m] << endl;
//    return 0;
//}

const int N = 110;

int f[N], v[N], w[N];
int n, m;

int main()
{
    cin >> n >> m;
    for (int i = 0; i < n; i++)
    {
        int s;
        cin >> s;
        for (int j = 0; j < s; j++) cin >> v[j] >> w[j];
        for (int j = m; j >= 0; j--)
            for (int k = 0; k < s; k++)
                if (j >= v[k])
                    f[j] = max(f[j], f[j - v[k]] + w[k]);
    }
    cout << f[m] << endl;
    return 0;
}